package queue

import (
	"60321/pkg/global"
	"60321/pkg/models"
	"encoding/json"
	"gorm.io/gorm"
	"log"

	"github.com/streadway/amqp"
)

type OrderQueue struct {
	conn *amqp.Connection
	db   *gorm.DB
}

func NewOrderQueue(conn *amqp.Connection) *OrderQueue {
	return &OrderQueue{
		conn: conn,
		db:   global.Db,
	}
}

func (q *OrderQueue) Consume() {
	ch, err := q.conn.Channel()
	if err != nil {
		log.Fatal(err)
	}
	defer func(ch *amqp.Channel) {
		err := ch.Close()
		if err != nil {
			log.Fatal(err)
		}
	}(ch)

	queue, err := ch.QueueDeclare(
		"order_queue", // 队列名
		true,          // 持久化
		false,         // 自动删除
		false,         // 排他性
		false,         // 不等待
		nil,           // 参数
	)
	if err != nil {
		log.Fatal(err)
	}

	msgs, err := ch.Consume(
		queue.Name, // 队列
		"",         // 消费者
		false,      // 自动应答
		false,      // 排他性
		false,      // 不等待
		false,      // 参数
		nil,
	)
	if err != nil {
		log.Fatal(err)
	}

	forever := make(chan bool)

	go func() {
		for d := range msgs {
			var order = models.UserTicketModel{}
			if err := json.Unmarshal(d.Body, &order); err != nil {
				log.Printf("Error decoding order: %v", err)
				err := d.Nack(false, true)
				if err != nil {
					return
				} // 重试
				continue
			}

			// 处理订单
			if err := q.processOrder(order); err != nil {
				log.Printf("Error processing order: %v", err)
				err := d.Nack(false, true)
				if err != nil {
					return
				} // 重试
				continue
			}

			err := d.Ack(false)
			if err != nil {
				return
			} // 确认消息处理完成
		}
	}()
	log.Printf(" [*] Waiting for messages. To exit press CTRL+C")
	<-forever
}

func (q *OrderQueue) processOrder(order models.UserTicketModel) error {
	// 1. 保存订单到数据库
	if err := global.Db.Create(&order).Error; err != nil {
		return err
	}
	return nil
}
